package QianFeng03;

/**单例设计模式
 * 保证一个类仅有一个实例，并提供一个访问它的全局访问点
 * 1、构造方法私有化
 * 2、声明一个本类对象
 * 3、给外部提供一个静态方法获取对象实例
 * <p>
 * 1.懒汉式：在第一次调用getInstance方法时，对象被创建，到程序结束后释放
 * 2.饿汉式：在类被加载后，对象被创建，到程序结束后释放
 * <p>
 * 在项目中为什么要使用单例，单例有什么好处？
 * 1.在设计一些工具类的时候（通常工具类，只有功能方法，没有属性）
 * 2.工具类可能会被频繁调用
 * 目的：为了节省重复创建对象带来的内存消耗，从而来提供效率
 * <p>
 * 能不能使用构造方法私有化+静态方法来代替单例
 */
public class Test9 {
    public static void main(String[] args) {
        //Singleton1 s = new Singleton1(); 私有的不能直接实例化对象
        Singleton1 s1 = Singleton1.getInstance(); //直接将s给s1
        s1.print();
        Singleton1 s2 = Singleton1.getInstance();
        s2.print();
        System.out.println(s1 == s2);//为True，s1就是s2

    }
}
//使用 造方法私有化+静态方法 来实现工具类，比如 Math
class Tools {
    private Tools(){}
    public static void print(){

    }
    public static void print2(){

    }
}

//饿汉式：占用内存的时间长，提高效率
class Singleton1 {
    //构造方法私有化
    private Singleton1() {
    }

    //声明一次本类对象
    private static Singleton1 s = new Singleton1();

    //给外部提供一个静态方法获取对象实例
    public static Singleton1 getInstance() {
        return s;
    }

    public void print() {
        System.out.println("测试方法！");
    }
}

//懒汉式：占用内存的时间短，效率低（延迟加载）
//在多线程访问时会有安全问题
class Singleton2 {
    private Singleton2() {
    }

    private static Singleton2 s;

    public static Singleton2 getInstance() {
        if (s == null) {
            s = new Singleton2();
        }
        return s;
    }

    public void print() {
        System.out.println("测试方法！");
    }
}